package com.hmall.item.web;

import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.hmall.item.pojo.Item;
import com.hmall.item.pojo.PageDTO;
import com.hmall.item.service.IItemService;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpRequest;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;

import java.util.Date;
import java.util.List;

@RestController
@RequestMapping("/item")
public class ItemController {
    @Autowired
    RabbitTemplate rabbitTemplate;
    @Autowired
    private IItemService itemService;

    /**
     * 分页查询
     * @param page
     * @param size
     * @return
     */
    @GetMapping("/list")
    public PageDTO<Item> list(@RequestParam(name = "page") Integer page,
                              @RequestParam(name = "size") Integer size){
        //创建分页IPage接口类型对象: 参数1 :当前页  参数2 :每页大小
        IPage<Item> iPage = new Page<>(page,size);
        IPage<Item> pageInfo = itemService.page(iPage,null);
        //获取分页结果
        PageDTO<Item> PageDTO = new PageDTO<>();
        //填充总条数
        PageDTO.setTotal(pageInfo.getTotal());
        //填充当页数据
        PageDTO.setList(pageInfo.getRecords());
        return PageDTO;
    }

    /**
     * 新增商品
     * @param item
     */
    @PostMapping
    public void insert(@RequestBody Item item){
        item.setCreateTime(new Date());
        item.setUpdateTime(new Date());
        //保存到数据库
        itemService.save(item);
        //发消息给rabbitMQ
        String json = JSON.toJSONString(item);
        // 发型消息,指定交换机名称,路由key,数据
        rabbitTemplate.convertAndSend("item.direct","item.insert",json);
    }

    /**
     * 上架and下架商品
     * @param id
     * @param status
     */
    @PutMapping("/status/{id}/{status}")
    public void down(@PathVariable Long id,
                     @PathVariable Integer status){
        Item item = new Item();
        item.setId(id);
        item.setStatus(status);
        itemService.updateById(item);
        Item item1 = itemService.getById(id);

        //发送消息
        //上架新增
        if (status == 1){
            //发消息给rabbitMQ
            String json = JSON.toJSONString(item1);
            // 发型消息,指定交换机名称,路由key,数据
            rabbitTemplate.convertAndSend("item.direct","item.insert",json);
        }
        //下架删除
        if (status == 2){
            //发消息给rabbitMQ
            rabbitTemplate.convertAndSend("item.direct","item.delete",item1.getId().toString());
        }
    }

    /**
     * 修改商品
     * @param item
     */
    @PutMapping
    public void update(@RequestBody Item item){
        item.setUpdateTime(new Date());
        itemService.updateById(item);
    }

    /**
     * 根据id删除商品
     * @param id
     */
    @DeleteMapping("/{id}")
    public void delete(@PathVariable Long id){
        itemService.removeById(id);
    }

    /**
     * 根据id查找
     * @param id
     * @return
     */
    @GetMapping("/{id}")
    public Item getById(@PathVariable Long id){
        return itemService.getById(id);
    }

    /**
     * 扣减库存
     * @param itemId
     * @param num
     */
    @PutMapping("/stock/{itemId}/{num}")
    public void updateStock(@PathVariable Long itemId,
                            @PathVariable Integer num ){
        //模拟报错
         //int n = 1/0;
        //1.查询商品
        Item item = itemService.getById(itemId);
        //判断num的正负 , num为负数扣减库存 , num为正数增加库存
        if ((num < 0) && (item.getStock() < num * -1)) {//扣减库存且库存不足
            throw new RuntimeException("商品库存不足");
        }
            //3.扣减库存
            item.setStock(item.getStock() + num);
            //4.更新库存
            itemService.updateById(item);
    }
}
